#ifndef MODELS_H
#define MODELS_H

#include <QString>
#include <QDateTime>
#include <QJsonObject>
#include <QJsonArray>
#include <QList>

/**
 * @brief 餐厅点餐系统数据模型定义
 * 
 * 包含用户、菜品、订单、评分等所有业务实体的数据结构定义
 * 每个模型都提供JSON序列化和反序列化方法
 */

namespace RestaurantSystem {

// 前置声明
class Customer;
class MenuItem;
class Order;
class OrderItem;
class Rating;
class AdminConfig;
class UserSettings;

// 重新下单功能相关前置声明
struct ReorderResult;
struct ItemValidationResult;
enum class ReorderErrorCode;

/**
 * @brief 顾客信息模型
 */
class Customer {
public:
    QString id;                    // 顾客唯一标识
    QString username;              // 用户名
    QString passwordHash;          // 密码哈希值
    QString plainPassword;         // 明文密码（仅供管理员查看）
    QString email;                 // 邮箱地址
    QDateTime registrationDate;    // 注册时间
    QDateTime lastLoginDate;       // 最后登录时间

    Customer() = default;
    Customer(const QString& username, const QString& passwordHash, const QString& email = "");
    
    // JSON序列化
    QJsonObject toJson() const;
    static Customer fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
};

/**
 * @brief 管理员配置模型
 */
class AdminConfig {
public:
    QString passwordHash;          // 管理员密码哈希值
    QDateTime lastModified;        // 最后修改时间

    AdminConfig() = default;
    AdminConfig(const QString& passwordHash);
    
    // JSON序列化
    QJsonObject toJson() const;
    static AdminConfig fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
};

/**
 * @brief 菜品信息模型
 */
class MenuItem {
public:
    QString id;                    // 菜品唯一标识
    QString name;                  // 菜品名称
    QString category;              // 菜品分类
    double price;                  // 价格
    int stock;                     // 库存数量
    QString description;           // 菜品描述
    QString imageUrl;              // 菜品图片路径
    int salesCount;                // 销量统计
    QDateTime createdDate;         // 创建时间
    QDateTime lastModified;        // 最后修改时间

    MenuItem() = default;
    MenuItem(const QString& name, const QString& category, double price, 
             int stock, const QString& description = "");
    
    // JSON序列化
    QJsonObject toJson() const;
    static MenuItem fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
    
    // 业务方法
    bool isInStock() const { return stock > 0; }
    bool updateStock(int newStock);
    void increaseSales(int count = 1) { salesCount += count; }
};

/**
 * @brief 订单状态枚举
 */
enum class OrderStatus {
    PENDING = 0,     // 待处理
    PREPARING = 1,   // 制作中
    COMPLETED = 2,   // 已完成
    CANCELLED = 3    // 已取消
};

// 订单状态转换函数
QString orderStatusToString(OrderStatus status);
OrderStatus stringToOrderStatus(const QString& statusStr);

/**
 * @brief 订单项模型
 */
class OrderItem {
public:
    QString menuItemId;            // 菜品ID
    QString menuItemName;          // 菜品名称(冗余存储，防止菜品被删除)
    double price;                  // 单价(下单时的价格)
    int quantity;                  // 数量
    double subtotal;               // 小计

    OrderItem() = default;
    OrderItem(const QString& menuItemId, const QString& menuItemName, 
              double price, int quantity);
    
    // JSON序列化
    QJsonObject toJson() const;
    static OrderItem fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    
    // 业务方法
    void calculateSubtotal() { subtotal = price * quantity; }
};

/**
 * @brief 订单模型
 */
class Order {
public:
    QString id;                    // 订单唯一标识
    QString customerId;            // 顾客ID
    QList<OrderItem> items;        // 订单项列表
    double totalAmount;            // 订单总金额
    OrderStatus status;            // 订单状态
    QDateTime createdDate;         // 创建时间
    QDateTime completedDate;       // 完成时间
    QString paymentMethod;         // 支付方式

    Order() = default;
    Order(const QString& customerId, const QList<OrderItem>& items, 
          const QString& paymentMethod = "");
    
    // JSON序列化
    QJsonObject toJson() const;
    static Order fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
    
    // 业务方法
    void calculateTotal();
    bool updateStatus(OrderStatus newStatus);
    bool isCompleted() const { return status == OrderStatus::COMPLETED; }
    bool canCancel() const { return status == OrderStatus::PENDING; }
    int getTotalItems() const;
};

/**
 * @brief 评分模型
 */
class Rating {
public:
    QString id;                    // 评分唯一标识
    QString orderId;               // 关联订单ID
    QString customerName;          // 顾客用户名（原customerId改为customerName）
    int rating;                    // 评分(1-5星)
    QString comment;               // 评价内容
    QDateTime createdDate;         // 创建时间

    Rating() = default;
    Rating(const QString& orderId, const QString& customerName, 
           int rating, const QString& comment = "");
    
    // JSON序列化
    QJsonObject toJson() const;
    static Rating fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
    
    // 业务方法
    bool isValidRating() const { return rating >= 1 && rating <= 5; }
};

/**
 * @brief 统计数据模型
 */
class Statistics {
public:
    struct StockInfo {
        QString menuItemId;
        QString menuItemName;
        int currentStock;
        int lowStockThreshold = 5;
        bool isLowStock() const { return currentStock <= lowStockThreshold; }
    };
    
    struct SalesInfo {
        QString menuItemId;
        QString menuItemName;
        int totalSales;
        double totalRevenue;
    };
    
    struct RatingInfo {
        double averageRating;
        int totalRatings;
        QList<int> ratingDistribution; // [1星数量, 2星数量, ..., 5星数量]
    };
    
    QList<StockInfo> stockInfos;
    QList<SalesInfo> salesInfos;
    RatingInfo overallRating;
    
    Statistics() = default;
    
    // JSON序列化
    QJsonObject toJson() const;
    static Statistics fromJson(const QJsonObject& json);
};

/**
 * @brief 用户设置模型
 */
class UserSettings {
public:
    QString userId;                // 用户ID
    QString theme;                 // 主题: "light", "dark", "auto"
    int fontSize;                  // 字体大小: 9-16
    bool enableNotifications;      // 启用通知
    bool autoLogin;               // 自动登录
    QString language;             // 语言设置: "zh_CN", "en_US"
    QDateTime lastModified;       // 最后修改时间

    UserSettings() 
        : theme("light")
        , fontSize(12)
        , enableNotifications(true)
        , autoLogin(false)
        , language("zh_CN")
        , lastModified(QDateTime::currentDateTime())
    {}
    
    UserSettings(const QString& user_id) 
        : userId(user_id)
        , theme("light")
        , fontSize(12)
        , enableNotifications(true)
        , autoLogin(false)
        , language("zh_CN")
        , lastModified(QDateTime::currentDateTime())
    {}
    
    // JSON序列化
    QJsonObject toJson() const;
    static UserSettings fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
    
    // 工具方法
    bool isValidTheme(const QString& themeValue) const;
    bool isValidFontSize(int size) const;
    bool isValidLanguage(const QString& lang) const;
};

/**
 * @brief 重新下单错误码枚举
 */
enum class ReorderErrorCode {
    SUCCESS = 0,                    // 成功
    USER_NOT_LOGIN = 1001,         // 用户未登录
    ORDER_NOT_FOUND = 1002,        // 订单不存在
    CART_FULL = 1003,              // 购物车已满
    ALL_ITEMS_UNAVAILABLE = 1004,  // 所有菜品都不可用
    SYSTEM_ERROR = 2001,           // 系统错误
    DATA_ACCESS_ERROR = 2002,      // 数据访问错误
    NETWORK_ERROR = 2003           // 网络错误
};

/**
 * @brief 菜品验证结果结构体
 */
struct ItemValidationResult {
    bool isAvailable;                  // 菜品是否可用
    bool hasStock;                     // 是否有库存
    int availableQuantity;             // 可用数量
    int requestedQuantity;             // 请求数量
    MenuItem currentItem;              // 当前菜品信息
    QString errorMessage;              // 错误信息
    
    ItemValidationResult() 
        : isAvailable(false)
        , hasStock(false)
        , availableQuantity(0)
        , requestedQuantity(0)
        , errorMessage("")
    {}
    
    ItemValidationResult(bool available, bool stock, int available_qty, 
                        int requested_qty, const MenuItem& item, const QString& error = "")
        : isAvailable(available)
        , hasStock(stock)
        , availableQuantity(available_qty)
        , requestedQuantity(requested_qty)
        , currentItem(item)
        , errorMessage(error)
    {}
    
    // JSON序列化
    QJsonObject toJson() const;
    static ItemValidationResult fromJson(const QJsonObject& json);
    
    // 验证方法
    bool isValid() const { return isAvailable && hasStock && availableQuantity > 0; }
    bool canAddPartially() const { return isAvailable && hasStock && availableQuantity < requestedQuantity; }
    bool isCompletelyUnavailable() const { return !isAvailable || !hasStock || availableQuantity <= 0; }
};

/**
 * @brief 重新下单结果结构体
 */
struct ReorderResult {
    bool isSuccess;                    // 整体是否成功
    ReorderErrorCode errorCode;        // 错误码
    int totalItems;                    // 原订单总项目数
    int successItems;                  // 成功添加项目数
    int partialItems;                  // 部分添加项目数
    int failedItems;                   // 完全失败项目数
    QStringList unavailableItems;      // 不可用菜品列表
    QStringList insufficientItems;     // 库存不足菜品列表
    QStringList successItemsDetails;   // 成功添加的菜品详情
    QList<ItemValidationResult> validationResults; // 详细验证结果
    QString message;                   // 结果描述
    double totalAmount;                // 成功添加的总金额
    QDateTime processTime;             // 处理时间
    
    ReorderResult() 
        : isSuccess(false)
        , errorCode(ReorderErrorCode::SYSTEM_ERROR)
        , totalItems(0)
        , successItems(0)
        , partialItems(0)
        , failedItems(0)
        , totalAmount(0.0)
        , processTime(QDateTime::currentDateTime())
    {}
    
    // JSON序列化
    QJsonObject toJson() const;
    static ReorderResult fromJson(const QJsonObject& json);
    
    // 数据验证
    bool isValid() const;
    QString getValidationError() const;
    
    // 业务方法
    bool hasAnySuccess() const { return successItems > 0 || partialItems > 0; }
    bool isCompleteSuccess() const { return isSuccess && failedItems == 0; }
    bool isPartialSuccess() const { return hasAnySuccess() && failedItems > 0; }
    bool isCompleteFailure() const { return !hasAnySuccess(); }
    double getSuccessRate() const { 
        return totalItems > 0 ? (double)(successItems + partialItems) / totalItems : 0.0; 
    }
    
    // 生成用户友好的描述信息
    QString generateUserMessage() const;
    QString generateDetailedReport() const;
};

// 重新下单错误码辅助函数
QString reorderErrorCodeToString(ReorderErrorCode code);
ReorderErrorCode stringToReorderErrorCode(const QString& codeStr);

} // namespace RestaurantSystem

#endif // MODELS_H
